package com.bygf.curve;

import com.bygf.curve.panel.ChartPanel;
import com.bygf.curve.utils.ToolTipFormat;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 时间曲线，横轴时间，纵轴是数值
 *
 * @author sunyupei
 */
public class TimeCurve extends Curve {

    //X数值集合
    List<Date> XValueList = new ArrayList<>();
    //Y数值集合
    List<Double> YValueList = new ArrayList<>();

    /**
     * 构造方法
     *
     * @param name
     */
    public TimeCurve(String name) {
        this.name = name;
        this.toolTipFormat = new ToolTipFormat("{0}:{1},{2}", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"), new DecimalFormat("#.#"));
    }

    @Override
    public void valueToPix(ChartPanel chartPanel) {
        XPixList.clear();
        YPixList.clear();
        valueIndex = -1;
        for (int i = 0; i < XValueList.size(); i++) {
            //过滤在当前X轴坐标范围内不会绘制出来的数据，用于节省绘制时间
            if (XValueList.get(i).getTime() < chartPanel.getXAxis().getStartValueNow()
                    || XValueList.get(i).getTime() > chartPanel.getXAxis().getEndValueNow()) {
                if (i + 1 < XValueList.size()) {
                    if ((XValueList.get(i + 1).getTime() < chartPanel.getXAxis().getStartValueNow()
                            || XValueList.get(i + 1).getTime() > chartPanel.getXAxis().getEndValueNow())
                            && chartPanel.getXAxis().getEndValueNow() - chartPanel.getXAxis().getStartValueNow() > 1000L * 60 * 5) {
                        continue;
                    }
                }
            }
            double x = chartPanel.getXAxis().valueToPix(XValueList.get(i).getTime());
            double y;
            if (isUsedY2Axis()) {
                y = chartPanel.getY2Axis().valueToPix(YValueList.get(i));
            } else {
                y = chartPanel.getYAxis().valueToPix(YValueList.get(i));
            }
            XPixList.add(x);
            YPixList.add(y);
            if (valueIndex == -1) {
                valueIndex = i;
            }
        }
    }

    /**
     * 往曲线中增加数值
     *
     * @param xValue
     * @param yValue
     */
    public void addItem(Date xValue, double yValue) {
        XValueList.add(xValue);
        YValueList.add(yValue);
    }

    @Override
    public String getToolTip(Point point) {
        for (int i = 0; i < XPixList.size(); i++) {
            Point2D pointTemp = new Point2D.Double(XPixList.get(i), YPixList.get(i));
            if (pointTemp.distance(point) < getRender().getStroke().getLineWidth() * 2) {
                ArrayList list = new ArrayList();
                list.add(name);
                list.add(XValueList.get(i + valueIndex));
                list.add(YValueList.get(i + valueIndex));
                return toolTipFormat.format(list);
            }
        }
        return null;
    }
}
